/** 
 * 路由处理函数模块
 * 在这里定义和用户相关的路由处理函数，供 /router/user.js 模块进行调用
 */

// 导入 bcryptjs 加密模块
const bcrypt = require('bcryptjs')
// 导入数据库操作模块
const db = require('../config/database')
// 导入 SQL 查询语句
const userQueries = require('../config/userQueries')
// 导入生成 Token 包
const jwt = require('jsonwebtoken')
// 导入 全局配置文件
const config = require('../config/index')

// 注册用户的处理函数
exports.regUser = (req, res) => {
  // 接收表单数据
  const userinfo = req.body
  // 调用数据库查询方法，查询用户名是否被占用
  db.query(userQueries.SELECT_USER_BY_USERNAME, userinfo.username, (error, result) => {
    // 执行 SQL 语句失败
    if (error) return res.cc(error, 500)
    // 执行 SQL 语句成功，但用户名已存在
    if (result.length > 0) {
      return res.cc('用户名被占用，请更换其他用户名！', 409)
    } else {
      // 加密用户密码
      userinfo.password = bcrypt.hashSync(userinfo.password, 10)
      // 调用数据库查询方法，执行插入新用户的 SQL 语句
      db.query(userQueries.INSERT_USER, { username: userinfo.username, password: userinfo.password },
        (error, result) => {
          // 执行 SQL 语句失败
          if (error) return res.cc(error, 500)
          // SQL 语句执行成功，但影响行数不为 1
          if (result.affectedRows !== 1) return res.cc('注册用户失败，请稍后再试！', 501)
          // 注册成功
          res.cc('注册成功！', 200)
        })
    }
  })
}


// 登录的处理函数
exports.login = (req, res) => {
  // 接收表单数据
  const userinfo = req.body
  // 执行 SQL 语句，根据用户名查询用户信息
  db.query(userQueries.SELECT_USER_BY_USERNAME, userinfo.username, (error, result) => {
    // SQL 语句执行失败
    if (error) return res.cc(error, 500)
    // SQL 语句执行成功，但获取到的数据条数不等于 1
    if (result.length !== 1) return res.cc('登录失败')
    // 根据用户输入的密码与数据库中存储的密码对比，对比成功则为 true，反之则为 false
    const compareResult = bcrypt.compareSync(userinfo.password, result[0].password)
    // 两者对比失败，返回错误信息
    if (!compareResult) return res.cc('登录失败，用户名或密码错误！')
    // 获取用户信息后，剔除 password 和user_pic这两个字段
    const user = { ...result[0], password: '', user_pic: '' }
    // 加密用户信息，生成 Token 字符串
    const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })
    res.send({
      code: 200,
      msg: '登录成功！',
      token: `Bearer ${tokenStr}`
    })
  })
}